#pragma once
#include <iostream>
#include "InetArr.hpp"
#include <sys/epoll.h>
#include <fcntl.h>

class Reactor;
class Connection
{
public:
    void SetSockfd(int sockfd) { _sockfd = sockfd; }
    int GetSockfd() { return _sockfd; }
    void SetEvent(uint32_t event) { _event = event; }
    uint32_t GetEvent() { return _event; }
    void SetOwner(Reactor *owner) { _owner = owner; }
    Reactor *GetOwner() { return _owner; }
    void SetInetAddr(InetAddr inet) { _inet_addr = inet; }
    InetAddr GetInetAddr() { return _inet_addr; }

    virtual void Recver() = 0;
    virtual void Sender() = 0;
    virtual void Excepter() =0;
    void SetNonBlock()
    {
        // 文件描述符fd  操作类型  具体参数（根据操作类型不同来确定不同参数）
        int flags = fcntl(_sockfd, F_GETFL, 0);
        if (flags < 0)
        {
            perror("fcntl");
            return;
        }
        fcntl(_sockfd, F_SETFL, flags | O_NONBLOCK);
    }
    

protected:                  // 继承类直接访问
    int _sockfd;            // 文件接口
    std::string _inbuffer;  // 输入缓冲区
    std::string _outbuffer; // 输出缓冲区

    InetAddr _inet_addr;       // 对应网络地址
    uint32_t _event; // 关系事件
    Reactor *_owner;           // 回指主类
};